/**
 * 繁殖兔子的问题
 * 如果1对兔子每月能生1对小兔子，而每对小兔在它出生后的第3个月就可以生1对小兔子，如果从1对初生的小兔子开始，1年后能
 * 繁殖多少兔子？
 */
function fn1() {
    console.log("兔子问题：")
    var month = 12;
    var f = []
    //第0个月  1对1月大的兔子 f0 = 1;
    //第1个月  1对2月大的兔子 f1 = 1;
    //第2个月  1对3月大的兔子+1对1月大的兔子 f2 = 2; 
    //第3个月  1对4月大的兔子+1对2月大的兔子+1对1月大的兔子 f3 = 3; 
    //第4个月  1对5月大的兔子+1对3月大的兔子+1对2月大的兔子+2对1月大的兔子 f4 = 5 ;
    //第5个月  1对6月大的兔子+1对4月大的兔子+1对3月大的兔子+2对2月大的兔子+3对1月大的兔子 f5=8
    for (var i = 0; i <= 12; i++) {
        if (i < 2) {
            f[i] = 1;
        } else {
            f[i] = f[i - 1] + f[i - 2]
        }
        // console.log("第" + i + "个月有" + f[i] + "对兔子");
    }
    console.log("第" + 12 + "个月有" + f[12] + "对兔子");
    console.log('_____________________________________________________');
}
fn1();


/**
 * 这个一个关于存钱的问题，一个富二代给他儿子的四年大学生活存一笔钱，富三代每月只能取3k作为下个月的生活费，
 * 采用的是整存零取的方式，年利率在1.71%，请问富二代需要一次性存入多少钱。
 */
function fn2() {
    console.log('存钱问题:')
    //第48个月 3000 f[48]
    //第47个月 f[48]/(1+0.0171/12)
    //第46个月 f[47]/(1+0.0171/12)
    var month = 48;
    var f = [];
    for (var i = 48; i >= 0; i--) {
        if (i == 48) {
            f[i] = 3000
        } else {
            f[i] = (f[i + 1] + 3000) / (1 + 0.0171 / 12);
        }
        // console.log('第' + i + '个月存款为:' + f[i]);
    }
    console.log('第' + 1 + '个月存款为:' + f[1]);
    console.log('_____________________________________________________');
}
fn2();


/**
 * 求数的阶乘，由于阶乘的规模容易变得过大，导致堆栈溢出，所以不能求太大的数
 */
function fn3(n) {
    console.log('求数的阶乘:')
    console.log(n + '阶乘结果为：' + go(n));
    console.log('_____________________________________________________');
}

function go(n) {
    if (n == 1) {
        return 1;
    } else {
        return n * go(n - 1);
    }
}
fn3(3);

/**
 * 十进制转成二进制
 */
function fn4(n) {
    console.log('十进制转成二进制:');
    var str = '';
    var result = go(n);
    result = result.split('').reverse().join('');
    console.log(n + ' 转成二进制:' + result);
    console.log('_____________________________________________________');

    function go(n) {
        if (Math.floor(n / 2) == 0) {
            return str + n % 2;
        } else {
            str += (n % 2);
            return go(Math.floor(n / 2));
        }
    }
}
fn4(100);

/**
 * 找零钱问题
 */

function fn5(n) {
    var values = [0.1, 0.5, 1, 5, 10, 20, 50, 100] //所有RMB面值集合
    var result = {};
    values.map(function(value) {
        result = Object.defineProperty(result, value, {
            value: 0,
            writable: true,
            enumerable: true
        })
    });
    var i = 1;
    while (true) {
        if (n.toFixed(1) == 0) {
            console.log('找零钱问题：');
            Object.keys(result).map(function(key) {
                if (result[key] !== 0) {
                    console.log("面值" + key + ":" + result[key] + "张");
                    console.log('_____________________________________________________');
                }
            });
            return;
        } else {
            var max = values[values.length - i];
            if (n.toFixed(1) >= max) {
                result[max] += 1;
                n -= max;
            } else {
                i++;
            }
        }
    }
}
fn5(129.7);


/**
 * 求解：
 *     算   法   洗   脑  题
 * 
 * 
 *     X                 算
 * ------------------------
 * 题  题   题   题    题  题
 *
 */

function fn6() {
    var count = 0;
    //算的取值
    for (var i1 = 1; i1 <= 9; i1++) {
        // 法的取值
        for (var i2 = 0; i2 <= 9; i2++) {
            // 洗的取值
            for (var i3 = 0; i3 <= 9; i3++) {
                // 脑的取值
                for (var i4 = 0; i4 <= 9; i4++) {
                    //题的取值
                    for (i5 = 1; i5 <= 9; i5++) {
                        var guess = (i1 * 10000 + i2 * 1000 + i3 * 100 + i4 * 10 + i5);
                        var result = i5 * 111111;
                        count++;
                        if (guess * i1 == result) {
                            console.log('时间复杂度O(n5)');
                            console.log("第" + (count) + "次搜索");
                            console.log('得出结果:');
                            console.log('\t' + guess.toString().split('').join('\t'));
                            console.log("\tX\t\t\t\t" + i1);
                            console.log('______________________');
                            console.log(result.toString().split('').join('\t'));
                            console.log('----------------------------------------------------');
                            return;
                        }
                    }
                }
            }
        }
    }
}
fn6();

function fn7() {
    var count = 0;
    var results = [111111, 222222, 333333, 444444, 555555, 666666, 777777, 888888, 999999];
    // 结果取值范围
    for (var i1 = 0; i1 < results.length; i1++) {
        //除数取值范围
        for (var i2 = 1; i2 < 10; i2++) {
            count++;
            var c1 = results[i1];
            var c2 = c1 % i2; //余数
            var c3 = c1 / i2; //被除数
            if (c2 == 0) {
                if (c1.toString().length - c3.toString().length == 1 && c3.toString().charAt(0) === i2.toString() && c3.toString().charAt(4) == (i1 + 1).toString()) {
                    console.log('时间复杂度O(n2)');
                    console.log("第" + (count++) + "次搜索");
                    console.log('得出结果:');
                    console.log('\t' + (results[i1] / i2).toString().split('').join('\t'));
                    console.log("\tX\t\t\t\t" + i2);
                    console.log('______________________');
                    console.log(results[i1].toString().split('').join('\t'));
                    console.log('_____________________________________________________');
                }


            }
        }
    }
}
fn7();

/**
 * 排序1：冒泡排序
 * 大数下沉（排后面），小数上浮(排前面)
 */
function fn8() {
    // 随机生成100个数放入数组中
    var arr = [];
    for (var i = 0; i < 10000; i++) {
        var number = Math.floor(Math.random() * 50000 + 10);
        arr.push(number);
    }
    temp = 0;
    var timestamp1 = new Date().getTime();
    for (var i = 0; i < arr.length; i++) {
        for (var j = 0; j < arr.length - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
    var timestamp2 = new Date().getTime();
    console.log("用时：" + (timestamp2 - timestamp1))
    console.log(arr);



}
fn8();